route.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. import { NextRequest, NextResponse } from 'next/server';
  2. import { getServerSession } from 'next-auth';
  3. import { authOptions } from '@/lib/auth';
  4. import { prisma } from '@/lib/prisma';
  5. interface RouteParams {
  6. params: Promise<{
  7. id: string;
  8. }>;
  9. }
  10. // PUT - Actualizar sección
  11. export async function PUT(request: NextRequest, { params }: RouteParams) {
  12. try {
  13. const session = await getServerSession(authOptions);
  14. if (!session || session.user.role !== 'ADMIN') {
  15. return NextResponse.json(
  16. { message: 'No autorizado' },
  17. { status: 401 }
  18. );
  19. }
  20. const { id } = await params;
  21. const body = await request.json();
  22. const { name, classId } = body;
  23. // Verificar si la sección existe
  24. const existingSection = await prisma.section.findFirst({
  25. where: {
  26. id,
  27. deletedAt: null,
  28. },
  29. });
  30. if (!existingSection) {
  31. return NextResponse.json(
  32. { message: 'Sección no encontrada' },
  33. { status: 404 }
  34. );
  35. }
  36. // Validaciones básicas
  37. if (!name || !classId) {
  38. return NextResponse.json(
  39. { message: 'Nombre y clase son requeridos' },
  40. { status: 400 }
  41. );
  42. }
  43. // Verificar si la clase existe
  44. const classExists = await prisma.class.findFirst({
  45. where: {
  46. id: classId,
  47. deletedAt: null,
  48. },
  49. include: {
  50. period: {
  51. select: {
  52. isActive: true,
  53. },
  54. },
  55. },
  56. });
  57. if (!classExists) {
  58. return NextResponse.json(
  59. { message: 'La clase seleccionada no existe' },
  60. { status: 400 }
  61. );
  62. }
  63. if (!classExists.period.isActive) {
  64. return NextResponse.json(
  65. { message: 'No se puede actualizar una sección para una clase de un periodo inactivo' },
  66. { status: 400 }
  67. );
  68. }
  69. // Verificar si ya existe otra sección con el mismo nombre para la misma clase
  70. if (name !== existingSection.name || classId !== existingSection.classId) {
  71. const duplicateSection = await prisma.section.findFirst({
  72. where: {
  73. name,
  74. classId,
  75. deletedAt: null,
  76. id: { not: id },
  77. },
  78. });
  79. if (duplicateSection) {
  80. return NextResponse.json(
  81. { message: 'Ya existe otra sección con este nombre para la clase seleccionada' },
  82. { status: 400 }
  83. );
  84. }
  85. }
  86. // Actualizar sección
  87. await prisma.section.update({
  88. where: { id },
  89. data: {
  90. name,
  91. classId,
  92. },
  93. });
  94. return NextResponse.json(
  95. { message: 'Sección actualizada exitosamente' },
  96. { status: 200 }
  97. );
  98. } catch (error) {
  99. console.error('Error updating section:', error);
  100. return NextResponse.json(
  101. { message: 'Error interno del servidor' },
  102. { status: 500 }
  103. );
  104. }
  105. }
  106. // DELETE - Eliminar sección (soft delete)
  107. export async function DELETE(request: NextRequest, { params }: RouteParams) {
  108. try {
  109. const session = await getServerSession(authOptions);
  110. if (!session || session.user.role !== 'ADMIN') {
  111. return NextResponse.json(
  112. { message: 'No autorizado' },
  113. { status: 401 }
  114. );
  115. }
  116. const { id } = await params;
  117. // Verificar si la sección existe
  118. const existingSection = await prisma.section.findFirst({
  119. where: {
  120. id,
  121. deletedAt: null,
  122. },
  123. include: {
  124. _count: {
  125. select: {
  126. teacherAssignments: true,
  127. studentEnrollments: true,
  128. },
  129. },
  130. },
  131. });
  132. if (!existingSection) {
  133. return NextResponse.json(
  134. { message: 'Sección no encontrada' },
  135. { status: 404 }
  136. );
  137. }
  138. // Verificar si la sección tiene asignaciones de profesores o inscripciones de estudiantes
  139. if (existingSection._count.teacherAssignments > 0 || existingSection._count.studentEnrollments > 0) {
  140. return NextResponse.json(
  141. { message: 'No se puede eliminar una sección que tiene profesores asignados o estudiantes inscritos' },
  142. { status: 400 }
  143. );
  144. }
  145. // Realizar soft delete
  146. await prisma.section.update({
  147. where: { id },
  148. data: {
  149. deletedAt: new Date(),
  150. },
  151. });
  152. return NextResponse.json(
  153. { message: 'Sección eliminada exitosamente' },
  154. { status: 200 }
  155. );
  156. } catch (error) {
  157. console.error('Error deleting section:', error);
  158. return NextResponse.json(
  159. { message: 'Error interno del servidor' },
  160. { status: 500 }
  161. );
  162. }
  163. }